package com.ruoyi.system.service.impl;

import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.request.AlipayTradeAppPayRequest;
import com.alipay.api.response.AlipayTradeAppPayResponse;
import com.ruoyi.system.service.IAliPayService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;

/**
 * 支付宝支付Service实现类（若依框架规范：放在system/service/impl目录）
 */
@Service
public class AliPayServiceImpl implements IAliPayService {

    private static final Logger logger = LoggerFactory.getLogger(AliPayServiceImpl.class);

    @Value("${alipay.app-id}")
    private String appId;

    @Value("${alipay.private-key}")
    private String privateKey;

    @Autowired
    private AlipayClient alipayClient; // 注入AlipayConfig中配置的客户端

    @Value("${alipay.notify-url}")
    private String notifyUrl; // 注入异步回调地址

    @Override
    public String generateAlipayPayParams(String orderNo, BigDecimal totalAmount, String subject, String body)
            throws AlipayApiException, IllegalArgumentException {
        // 1. 严格参数校验（若依框架要求：防止无效请求）暂时移除商品名称参数
        // validateParams(orderNo, totalAmount, subject);
        validateParams(orderNo, totalAmount);

        // 2. 创建支付宝统一下单请求对象（APP支付专用：AlipayTradeAppPayRequest）
        AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();

        // 3. 设置业务参数（bizContent）：JSON格式，符合支付宝API要求
        // 说明：product_code固定为"QUICK_MSECURITY_PAY"（APP支付）
        String bizContent = String.format(
                "{\"out_trade_no\":\"%s\",\"total_amount\":\"%s\",\"subject\":\"%s\",\"body\":\"%s\",\"product_code\":\"QUICK_MSECURITY_PAY\"}",
                orderNo,
                totalAmount.setScale(2, BigDecimal.ROUND_HALF_UP).toString(), // 金额保留两位小数（防止精度问题）
                subject,
                body != null ? body : "" // 描述为空时设为默认值
        );
        request.setBizContent(bizContent);

        // 4. 设置异步回调地址（关键：支付宝支付完成后主动通知该地址，用于更新订单状态）
        request.setNotifyUrl(notifyUrl);

        // 5. 调用支付宝SDK生成支付参数字符串（sdkExecute方法返回支付参数，无需同步等待支付结果）
        AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);

        // 6. 返回支付参数字符串（前端直接使用该字符串调用支付宝SDK）
        // 说明：response.getBody()即为格式化的支付参数（如：app_id=2021000117667979&biz_content=...&sign=...）
        return response.getBody();
    }

    /**
     * 参数校验（若依框架要求：单独提取方法，提高代码可读性）
     * , String subject
     */
    private void validateParams(String orderNo, BigDecimal totalAmount) {
        if (orderNo == null || orderNo.isEmpty()) {
            throw new IllegalArgumentException("订单号不能为空");
        }
        if (totalAmount == null || totalAmount.compareTo(BigDecimal.ZERO) <= 0) {
            throw new IllegalArgumentException("支付金额必须大于0");
        }
//        if (subject == null || subject.isEmpty()) {
//            throw new IllegalArgumentException("商品名称不能为空");
//        }
    }
}